/*
 * @Author: 9ilk 3535851673@qq.com
 * @Date: 2024-11-24 12:58:56
 * @LastEditors: 9ilk 3535851673@qq.com
 * @LastEditTime: 2024-11-24 13:51:45
 * @FilePath: /zhuang/Mutex/Main.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sched.h>
#include "Mutex.hpp"

using namespace LockModule;
// Mutex mtx; // 构造锁
int ticket = 0;
pthread_mutex_t mutex;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void *route(void *arg)
{
    char *id = (char *)arg;
    while (1)
    {
        {
            // LockGuard lockguard(mtx); //临时对象！！
            // //初始化这个临时对象自动加锁，处出了作用域销毁就自动解锁
            pthread_mutex_lock(&mutex);
            if (ticket > 0)
            {
                usleep(1000);
                printf("%s sells ticket:%d\n", id, ticket--);
                pthread_mutex_unlock(&mutex);
            }
            else
            {
                // 没票让他们去等待
                printf("%s wait on cond!\n", id);
                pthread_cond_wait(&cond, &mutex); //注意 醒来的时候会重新申请锁！拿了锁又加锁会被挂起
                printf("%s 被叫醒咯..\n", id);
            }
            pthread_mutex_unlock(&mutex);
        }
    }
    return nullptr;
}
int main(void)
{
    pthread_t t1, t2, t3, t4;
    pthread_mutex_init(&mutex, NULL);
    pthread_create(&t1, NULL, route, (void *)"thread 1");
    pthread_create(&t2, NULL, route, (void *)"thread 2");
    pthread_create(&t3, NULL, route, (void *)"thread 3");
    pthread_create(&t4, NULL, route, (void *)"thread 4");
    int cnt = 10;
    // 主线程放票
    while (true)
    {
        sleep(5);
        ticket += cnt;
        printf("主线程放票咯...\n");
        // 放票完唤醒一个线程
        pthread_cond_signal(&cond);
    }
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_join(t3, NULL);
    pthread_join(t4, NULL);
    pthread_mutex_destroy(&mutex);
}